package com.tjetc.generator;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * MyBatis-Plus 代码生成器配置类
 * 用于自动生成实体类、Mapper、Service、Controller等代码
 */
public class CodeGenerator {

    /**
     * 数据库配置信息
     */
    private static final String URL = "jdbc:mysql://172.16.190.131:3306/db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "1234";
    private static final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";

    /**
     * 包配置信息
     */
    private static final String PARENT_PACKAGE = "com.tjetc";
    private static final String MODULE_NAME = "";
    private static final String AUTHOR = "gaoyongxiang";

    /**
     * 需要生成的表名
     * 可以添加多张表，例如：Arrays.asList("user", "product", "order")
     */
    private static final List<String> TABLE_NAMES = Arrays.asList("user");
    
    /**
     * 不需要生成的表前缀
     * 例如表名为 t_user，配置为 "t_" 后，生成的实体名为 User
     */
    private static final String[] TABLE_PREFIX = {""};

    public static void main(String[] args) {
        generateCode();
    }

    /**
     * 生成代码的主方法
     */
    public static void generateCode() {
        // 1. 配置数据源
        DataSourceConfig.Builder dataSourceConfig = new DataSourceConfig.Builder(
                URL, USERNAME, PASSWORD
        )
                .dbQuery(new MySqlQuery())
                .typeConvert(new MySqlTypeConvert())
                .keyWordsHandler(new MySqlKeyWordsHandler());

        // 2. 创建代码生成器
        FastAutoGenerator generator = FastAutoGenerator.create(dataSourceConfig)

                // 3. 全局配置
                .globalConfig(globalConfigBuilder -> {
                    globalConfigBuilder
                            // 设置作者
                            .author(AUTHOR)
                            // 设置输出目录
                            .outputDir(System.getProperty("user.dir") + "/src/main/java")
                            // 禁止打开输出目录
                            .disableOpenDir()
                            // 设置日期类型
                            .dateType(DateType.TIME_PACK)
                            // 设置注释日期格式
                            .commentDate("yyyy-MM-dd")
                            // 设置Swagger注解
                            .enableSwagger();
                })

                // 4. 包配置
                .packageConfig(packageConfigBuilder -> {
                    packageConfigBuilder
                            // 设置父包名
                            .parent(PARENT_PACKAGE)
                            // 设置模块名
                            .moduleName(MODULE_NAME)
                            // 设置实体类包名
                            .entity("entity")
                            // 设置Mapper接口包名
                            .mapper("mapper")
                            // 设置Service接口包名
                            .service("service")
                            // 设置Service实现类包名
                            .serviceImpl("service.impl")
                            // 设置Controller包名
                            .controller("controller")
                            // 设置Mapper XML包名
                            .xml("mapper.xml");
                })

                // 5. 策略配置
                .strategyConfig(strategyConfigBuilder -> {
                    // 设置表名
                    strategyConfigBuilder.addInclude(TABLE_NAMES)
                            .addTablePrefix(TABLE_PREFIX);

                    // 实体类策略配置
                    strategyConfigBuilder.entityBuilder()
                            // 启用Lombok
                            .enableLombok()
                            // 禁用Serializable
                            .disableSerialVersionUID()
                            // 乐观锁字段
                            .versionColumnName("version")
                            .versionPropertyName("version")
                            // 逻辑删除字段
                            .logicDeleteColumnName("deleted")
                            .logicDeletePropertyName("deleted")
                            // 表字段名下划线转驼峰
                            .naming(NamingStrategy.underline_to_camel)
                            // 表字段注释
                            .enableTableFieldAnnotation()
                            // 格式化文件名称
                            .formatFileName("%s");

                    // Mapper策略配置
                    strategyConfigBuilder.mapperBuilder()
                            // 启用@Mapper注解
                            .enableMapperAnnotation()
                            // 格式化Mapper文件名称
                            .formatMapperFileName("%sMapper")
                            // 格式化Mapper XML文件名称
                            .formatXmlFileName("%sMapper")
                            // 设置通用Mapper接口
                            .superClass("com.baomidou.mybatisplus.core.mapper.BaseMapper");

                    // Service策略配置
                    strategyConfigBuilder.serviceBuilder()
                            // 格式化Service文件名称
                            .formatServiceFileName("I%sService")
                            // 格式化Service实现类文件名称
                            .formatServiceImplFileName("%sServiceImpl")
                            // 设置通用Service接口
                            .superServiceClass("com.baomidou.mybatisplus.extension.service.IService")
                            // 设置通用Service实现类
                            .superServiceImplClass("com.baomidou.mybatisplus.extension.service.impl.ServiceImpl");

                    // Controller策略配置
                    strategyConfigBuilder.controllerBuilder()
                            // 启用REST风格
                            .enableRestStyle()
                            // 启用驼峰转连字符
                            .enableHyphenStyle()
                            // 格式化Controller文件名称
                            .formatFileName("%sController");
                })

                // 6. 模板配置
                .templateConfig(templateConfigBuilder -> {
                    // 自定义模板
                    // templateConfigBuilder
                    //         .entity("templates/entity.java")
                    //         .mapper("templates/mapper.java")
                    //         .service("templates/service.java")
                    //         .serviceImpl("templates/serviceImpl.java")
                    //         .controller("templates/controller.java")
                    //         .mapperXml("templates/mapper.xml");
                })

                // 7. 模板引擎配置
                .templateEngine(new FreemarkerTemplateEngine());

        // 8. 执行代码生成
        generator.execute();
    }
}